#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <sys/wait.h>
#include <sys/types.h>
#include <time.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdlib.h>
// 1.考察pipe函数的使用， 以及对pipe函数参数的理解，同时考察对文件描述符的理解

// 2.要求：先创建管道， 进而创建子进程， 父子进程使用管道进行通信

// 父进程向管道当中写“i am father”，

// 子进程从管道当中读出内容, 并且打印到标准输出

// 3.提交要求：提交代码截图， 提交代码执行之后的截图
// int main()
// {
//     int pipefd[2]={0};
//     pipe(pipefd);
//     pid_t id = fork();
//     if(id==0)
//     {
//         printf("child process make success\n");
//         sleep(3);
//         close(pipefd[1]);
//         char buf[1024]={0};
//         read(pipefd[0],buf,sizeof(buf));
//         printf("child read:%s\n",buf);
//         close(pipefd[0]);
//     }
//     else if(id>0)
//     {
//         close(pipefd[0]);
//         const char* s="I am father";
//         write(pipefd[1],s,strlen(s));
//         close(pipefd[1]);
//         pid_t result = waitpid(id,nullptr,0);
//     }
//     return 0;
// }

// 1.考察命令mkfifo或者函数mkfifo创建命名管道

// 2.要求：创建出来的命名管道可以供两个进程通信

// 进程A 向管道当中写 “i am process A”

// 进程B 从管道当中读 并且打印到标准输出

int main()
{
    int n = mkfifo("./fifo", 0644);
    pid_t id = fork();
    if (id == 0)
    {
        int fd = open("./fifo", O_RDONLY);
        char buf[1024] = {0};
        while (true)
        {
            ssize_t byteread = read(fd, buf, sizeof(buf) - 1);
            if (byteread > 0)
            {
                buf[byteread] = '\0';
                printf("message : %s\n", buf);
                close(fd);
                exit(0);
            }
        }
    }
    else if (id > 0)
    {
        int fd = open("./fifo", O_WRONLY);
        const char *message = "I am process A";
        write(fd, message, strlen(message));
        pid_t result = waitpid(id, nullptr, 0);
        close(fd);
    }
    return 0;
}